package lc.weekly;

/**
 * <a href="https://leetcode-cn.com/contest/biweekly-contest-77">第 77 场双周赛</a>
 * <p>
 * 本场竞赛由「中信银行信用卡 & 力扣」联合主办
 */
public interface BiweeklyContest77 {

    /**
     * 6051. 统计是给定字符串前缀的字符串数目
     * <p>
     * 给你一个字符串数组words和一个字符串s，其中words[i] 和s只包含 小写英文字母。
     * <p>
     * 请你返回 words中是字符串 s前缀的 字符串数目。
     * <p>
     * 一个字符串的 前缀是出现在字符串开头的子字符串。子字符串是一个字符串中的连续一段字符序列。
     * <p>
     * 提示：
     * <ul>
     *     <li>1 <= words.length <= 1000</li>
     *     <li>1 <= words[i].length, s.length <= 10</li>
     *     <li>words[i] 和s只包含小写英文字母。</li>
     * </ul
     *
     * @param words
     * @param s
     * @return
     */
    int countPrefixes(String[] words, String s);

    /**
     * 6052. 最小平均差
     * <p>
     * <p>
     * 给你一个下标从 0开始长度为 n的整数数组nums。
     * <p>
     * 下标 i处的 平均差指的是 nums中 前i + 1个元素平均值和 后n - i - 1个元素平均值的 绝对差。两个平均值都需要 向下取整到最近的整数。
     * <p>
     * 请你返回产生 最小平均差的下标。如果有多个下标最小平均差相等，请你返回 最小的一个下标。
     * <p>
     * 注意：
     * <ul>
     *     <li>两个数的绝对差是两者差的绝对值。</li>
     *     <li>n个元素的平均值是 n个元素之 和除以（整数除法）n。</li>
     *     <li>0个元素的平均值视为0。</li>
     * </ul>
     * <p>
     * 提示：
     * <ul>
     *     <li>1 <= nums.length <= 10<sup>5</sup></li>
     *     <li>0 <= nums[i] <= 10<sup>5</sup></li>
     * </ul>
     *
     * @param nums
     * @return
     */
    int minimumAverageDifference(int[] nums);

    /**
     * 2257. 统计网格图中没有被保卫的格子数
     * <p>
     * <p>
     * 给你两个整数m和n表示一个下标从0开始的m x n网格图。同时给你两个二维整数数组guards 和walls，其中guards[i] = [row<sub>i</sub>, col<sub>i</sub>]且walls[j] = [row<sub>j</sub>, col<sub>j</sub>]，分别表示第 i个警卫和第 j座墙所在的位置。
     * <p>
     * 一个警卫能看到 4 个坐标轴方向（即东、南、西、北）的 所有格子，除非他们被一座墙或者另外一个警卫 挡住了视线。如果一个格子能被 <b>至少</b>一个警卫看到，那么我们说这个格子被 <b>保卫</b>了。
     * <p>
     * 请你返回空格子中，有多少个格子是 <b>没被保卫</b>的。
     * <p>
     * <b>提示：</b>
     * <ul>
     *     <li>1 <= m, n <= 10<sup>5</sup></li>
     *     <li>2 <= m * n <= 10<sup>5</sup></li>
     *     <li>1 <= guards.length, walls.length <= 5 * 10<sup>4</sup></li>
     *     <li>2 <= guards.length + walls.length <= m * n</li>
     *     <li>guards[i].length == walls[j].length == 2</li>
     *     <li>0 <= row<sub>i</sub>, row<sub>j</sub> < m</li>
     *     <li>0 <= col<sub>i</sub>, col<sub>j</sub> < n</li>
     *     <li>guards和walls中所有位置 <b>互不相同</b>。</li>
     * </ul>
     *
     * @param m
     * @param n
     * @param guards
     * @param walls
     * @return
     */
    int countUnguarded(int m, int n, int[][] guards, int[][] walls);

    /**
     * 2258. 逃离火灾
     * <p>
     * 给你一个下标从 0开始大小为 m x n的二维整数数组grid，它表示一个网格图。每个格子为下面 3 个值之一：
     * <ul>
     *     <li>0 表示草地。</li>
     *     <li>1 表示着火的格子。</li>
     *     <li>2表示一座墙，你跟火都不能通过这个格子。</li>
     * </ul>
     * 一开始你在最左上角的格子(0, 0)，你想要到达最右下角的安全屋格子(m - 1, n - 1)。每一分钟，你可以移动到相邻的草地格子。每次你移动 之后，着火的格子会扩散到所有不是墙的 相邻格子。
     * <p>
     * 请你返回你在初始位置可以停留的 最多 分钟数，且停留完这段时间后你还能安全到达安全屋。如果无法实现，请你返回 -1。如果不管你在初始位置停留多久，你 总是能到达安全屋，请你返回109。
     * <p>
     * 注意，如果你到达安全屋后，火马上到了安全屋，这视为你能够安全到达安全屋。
     * <p>
     * 如果两个格子有共同边，那么它们为 相邻格子。
     *
     * @param grid
     * @return
     */
    int maximumMinutes(int[][] grid);
}
